package com.hspedu.static_;

/**
 * @Author Stringzhua
 * @Date 2024/3/4 20:27
 * description:类方法使用细节和注意事项
 * 1.类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区:
 * 类方法中无this的参数
 * 2.类方法可以通过类名调用,也可以通过对象名调用【举例】
 * 3.普通方法和对象有关,需要通过对象名调用,比如:
 * 对象名.方法(参数)
 * 不能通过类名调用 【举例】
 * 4.类方法中不允许使用和对象有关的关键字,比如this和super,普通方法(成员方法)可以 【举例】
 * 5.类方法(静态方法)中 只能访问 静态变量 或 静态方法
 * 6.普通成员方法,既可以访问 非静态的成员,也可以访问静态成员
 */
public class StaticMethodDetail {
    public static void main(String[] args) {
        D.hi();//静态方法可以通过类名直接调用
        //非静态方法不能通过类名调用
        //D.say();//错误 Non-static method 'say()' cannot be referenced from a static context
        new D().say();//可以
    }
}

class D {
    private int n1 = 100;
    private static int n2 = 200;

    public void say() {
        //非静态方法
    }

    public static void hi() {
        //静态方法
        // 4.类方法中不允许使用和对象有关的关键字,
        // 比如this和super,普通方法(成员方法)可以 【举例】
//        System.out.println("this.n1 = " + this.n1);//不可以 'com.hspedu.static_.D.this' cannot be referenced from a static context
//        System.out.println("super.n1 = " + super.n1);//不可以 'com.hspedu.static_.D.super' cannot be referenced from a static context
    }
    //5.类方法(静态方法)中 只能访问 静态变量 或 静态方法
    //口诀:静态方法只能访问静态成员,
    public static void hello(){
        System.out.println(n2);
        System.out.println(D.n2);
//        System.out.println(this.n2);//不能使用
        hi();//ok
//        say();//不可以 Non-static method 'say()' cannot be referenced from a static context
    }

    //6.普通成员方法,既可以访问 非静态的成员,也可以访问静态成员
    //小结:非静态方法可以访问静态成员和非静态成员
    public void ok(){
        //非静态成员
        System.out.println(n1);
        say();
        //静态成员
        System.out.println(n2);
        hi();
        hello();
    }
}
